#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>

#define SIZE 1024

int main() {
    int shmid;          // 共享内存标识符
    char *shmemaddr;    // 共享内存地址
    char buff[SIZE];    // 缓冲区
    int shmstatus;      // 共享内存状态
    int pid;            // 进程ID

    // 创建共享内存
    shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600);
    if (shmid < 0) {
        perror("shmget ipc_id error");
        return -1;
    }

    pid = fork(); // 创建子进程

    if (pid == 0) { // 子进程
        shmemaddr = (char *)shmat(shmid, NULL, 0); // 附加共享内存
        if ((int)shmemaddr == -1) {
            perror("shmat addr error");
            return -1;
        }
        strcpy(shmemaddr, "Hello World!\n"); // 向共享内存中写入数据
        shmdt(shmemaddr); // 脱离共享内存
        return 0;
    } else if (pid > 0) { // 父进程
        sleep(1); // 等待子进程写入数据
        shmemaddr = (char *)shmat(shmid, NULL, 0); // 附加共享内存
        if ((int)shmemaddr == -1) {
            perror("shmat addr error");
            return -1;
        }
        strcpy(buff, shmemaddr); // 从共享内存中读取数据
        printf("I have got from shared memory:%s", buff);
        shmdt(shmemaddr); // 脱离共享内存
        shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
    } else {
        perror("fork error");
        shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
    }
    return 0;
}
